// 3-3 数据结构-结构与函数
/**
 * C++ 数据结构
 * C/C++ 数组允许定义可存储相同类型数据项的变量，但是结构是 C++ 中另一种用户自定义的可用的数据类型，它允许您存储不同类型的数据项。
 * 结构用于表示一条记录，假设您想要跟踪图书馆中书本的动态，您可能需要跟踪每本书的下列属性：
      Title ：标题
      Author ：作者
      Subject ：类目
      Book ID ：书的 ID
 * 
 * ---------------
 * 结构与函数
 * 
 * 1. 结构作为函数参数
 * 您可以把结构作为函数参数，传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量：
 * 
 * 2. 函数返回结构
 * 
*/
#include <iostream>
#include <string.h>
#include <ctime>

struct Employee
{
  int id;
  char name[50];
  int sex;
  int age;
};

struct Monster
{
  int id;
  char name[50];
  int hp;
  int atk;
  char remark[255];
};

struct Monster *create_mst(void);
struct Monster create_mst_(void);

void print_emp(struct Employee);
int main(void)
{
  /**
   * 示例一
  */

  Employee emp;

  emp.id = 1;
  strcpy(emp.name, "木木");
  emp.sex = 1;
  emp.age = 18;

  print_emp(emp);
  
  struct Monster mst;
  mst = create_mst_();
  std::cout << "--------怪物信息-------"
            << "\n"
            << "id : " << mst.id << "\n"
            << "名称 : " << mst.name << "\n"
            << "生命值 : " << mst.hp << "\n"
            << "攻击力 : " << mst.atk << "\n"
            << "描述 : " << mst.remark << std::endl;

  // struct Monster *mst;
  // mst = create_mst();
  // std::cout << "--------怪物信息-------"<< "\n"
  //           << "id : " << mst->id << "\n"
  //           << "名称 : " << mst->name << "\n"
  //           << "生命值 : " << mst->hp << "\n"
  //           << "攻击力 : " << mst->atk << "\n"
  //           << "描述 : " << mst->remark << std::endl;
  printf("-----------end------------\n");
  // system("pause");
  return 0;
}

void print_emp(struct Employee emp)
{
  std::cout << "--------人员信息-------"
            << "\n"
            << "id : " << emp.id << "\n"
            << "姓名 : " << emp.name << "\n"
            << "性别 : " << (emp.sex ? "男" : "女")
            << "\n"
            << "年龄 : " << emp.age << std::endl;
}

struct Monster *create_mst(void)
{
  static struct Monster mst;
  srand((unsigned)time(NULL));
  mst.id = rand();
  strcpy(mst.name, "随机怪物");
  mst.hp = rand() % 91 + 10;
  mst.atk = rand() % 18 + 3;
  strcpy(mst.remark, "这只随机怪物的描述信息");

  // return &mst;
}

struct Monster create_mst_(void)
{
  static struct Monster mst;
  srand((unsigned)time(NULL));
  mst.id = rand();
  strcpy(mst.name, "随机怪物");
  mst.hp = rand() % 91 + 10;
  mst.atk = rand() % 18 + 3;
  strcpy(mst.remark, "这只随机怪物的描述信息");

  return mst;
}